package pro.wy.reflex;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

import pro.wy.model.Apple;

public class Test {
	public static void main(String[] args) {
		// 反射分三种
		// 获取反射的 Class对象、通过反射创建类对象、通过反射获取类属性方法及构造器

		// 直接初始化，正射，运行时就已经确定了要运行的类（Apple）
		Apple apple = new Apple();
		apple.setPrice(4);
		// 反射，运行时通过字符串值才得知要运行的类，pro.wy.model.Apple
		try {
			Class clz;
			// 获取类的 Class 对象实例
			clz = Class.forName("pro.wy.model.Apple");
			// 根据 Class 对象实例获取 Constructor 对象
			Constructor constructor = clz.getConstructor();
			// 使用 Constructor 对象的 newInstance 方法获取反射类对象
			Object object = constructor.newInstance();
			// 获取方法的 Method 对象
			Method method = clz.getMethod("setPrice", int.class);
			// 利用 invoke 方法调用方法
			method.invoke(object, 4);
		} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException
				| IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}